package ij.hkust.QuickPALM;

import ij.plugin.PlugIn;

//
//import ij.IJ;
//import ij.ImagePlus;
//import ij.ImageStack;
//import ij.gui.Roi;
//import ij.io.DirectoryChooser;
//import ij.io.FileSaver;
//import ij.plugin.PlugIn;
//import ij.plugin.frame.RoiManager;
//import ij.process.ByteProcessor;
//import ij.process.ImageProcessor;
//import ij.process.ShortProcessor;
//
//import java.awt.Rectangle;
//import java.util.GregorianCalendar;
//
//import mmcorej.CMMCore;
//
//import org.micromanager.MMStudioMainFrame;
//
//import QuickPALM.AOTFController;
//
///**
// * 
// * @author linshan
// *
// */
public class runMulticolorSim implements PlugIn
{
//	public CMMCore core;
//	
//	ImageProcessor ip;
//	Object img;
//	
//	ImagePlus imp;
//
//	ImageStack res;
//
//	MyDialogs dg = new MyDialogs();
//	MyFunctions f = new MyFunctions();
//	MyIO io = new MyIO();
//
//	RoiManager rmanager;
//	
//	AOTFController aotf;
//	
	public void run(String arg)
	{}
}
//		IJ.showMessage("Stop LIVE!");
//		
//		IJ.register(runMulticolorSim.class); // static method of ij/IJ
//		// *if (!dg.analyseParticles(f)) return;
//		if (!(dg.loadAnalyseParticles() && dg.loadSimConfig()))
//		{
//			IJ.showMessage("Load failed");
//			return;
//		}
//
//		
//		aotf = new AOTFController();
//		
//		
//		rmanager = RoiManager.getInstance();
//		if(rmanager == null || rmanager.getCount() == 0)
//		{
//			dg.processROI = false;
//		}
//		else if(rmanager.getCount() > 1)
//		{
//			IJ.error("Error: More Than 1 ROIs");
//			return;
//		}
//		else
//		{
//			dg.processROI = true;
//			Roi[] roi = rmanager.getRoisAsArray();
//			Rectangle rec = roi[0].getBounds();
//			
//			dg.roixs = rec.x;
//			dg.roiys = rec.y;
//			dg.roixe = rec.x + rec.width;
//			dg.roiye = rec.y + rec.height;
//		}
//		
//		DirectoryChooser chooser = new DirectoryChooser("Choose STORM Working Directory");
//		if (chooser.getDirectory() == null)
//			return;
//		else
//			dg.STORMPath = chooser.getDirectory();
//		
//        // core = new CMMCore();		
//		
//		MMStudioMainFrame gui = MMStudioMainFrame.getInstance();
//        core = gui.getCore();
//
//		f.ptable.reset(); // erase particle table
//
//		if (dg.is3d)
//		{
//			dg.getCalibrationFile();
//			io.loadTransformation(dg.calfile, f.caltable);
//			f.initialize3d();
//		}
//		
//		
//		try
//		{
//		    int owidth = (int)core.getImageWidth();
//		    int oheight = (int)core.getImageHeight();
//			int width;
//			int height;
//			
//			if (dg.processROI)
//			{
//				width = dg.roixe - dg.roixs;
//				height = dg.roiye - dg.roiys;
//			}
//			else
//			{
//			    width = owidth;
//			    height = oheight;
//			}
//			
//			ReconstructionViewer viewer = new ReconstructionViewer(" Reconstruction", width, height, dg, f);
//			ViewerUpdateSim vUpdate;
//			ViewerUpdateShortSim vUpdateShort;
//			
//
//			ProcessFrameSim [] threads = new ProcessFrameSim[dg.threads];
//			int freeThread=-1;
//            
//			
//			long time_start = java.lang.System.currentTimeMillis();
//			long time_took = 0;
//			long time_now=0;
//			long nparticles=0;
//			String note="";            			
//			
//			
//			
//			int s=0;
//			boolean ok = true;
//			dg.run = true;
//			boolean on;
//			if (dg.drawer_nframe <= 0)
//				on = true;
//			else
//				on = false;	
//		
//		
//			if (! aotf.Open())
//			{
//				IJ.showMessage("AOTF loading failure");
//			}
//		
//			int index = 0;
//			
//			aotf.Write("dds f 0 151.4\r");
//			aotf.Write("dds f 1 123.175\r");
//			aotf.Write("dds f 2 111.8832\r");
//			aotf.Write("dds f 3 99.2574\r");
//			aotf.Write("dds f 4 92.4850\r");
//			aotf.Write("dds f 5 76.0686\r");
//			aotf.Write("dds f 6 0\r");
//			aotf.Write("dds f 7 0\r");
//			
//			aotf.Write("dau en\r");
//			aotf.Write("dau gain * 255\r");	
//						
//			
//			StopMulticolor stopper = new StopMulticolor();
//			stopper.mysetup(dg);
//			stopper.start();
//			
//
//			while (dg.run && ok && (index < dg.drawer_nframe || on))
//			{
//			
//				ip = null;
//				img = null;
//			
//				aotf.Write("dds a 5 "+dg.power_656+"\r");//656 laser on
//				aotf.Write("dds a 4 "+dg.power_561+"\r");//561 laser on (for tracking beads)
//				
//				if (index % 2 == 0)
//				{
//					aotf.Write("dds a 0 "+dg.power_405+"\r");//405 laser on								
//					
//					Thread.sleep(dg.pulse_duration);					
//										
//					aotf.Write("dds a 0 0\r");//405 laser off
//					
//					note = "_1";
//				}
//				else
//				{
//					aotf.Write("dds a 2 "+dg.power_488+"\r");//488 laser on								
//					
//					Thread.sleep(dg.pulse_duration);
//											
//					aotf.Write("dds a 2 0\r");//488 laser off
//					
//					note = "_2";
//				}
//				
//				long durBalance_start = GregorianCalendar.getInstance().getTimeInMillis();
//				core.snapImage();//Snap
//				img = core.getImage();								
//			
//					
//				if (img instanceof byte[])
//				{ 
//					ip = new ByteProcessor(owidth, oheight);
//					ip.setPixels((byte[])img);
//				}
//				else if (img instanceof short[])
//				{
//					ip = new ShortProcessor(owidth, oheight);
//					ip.setPixels((short[])img);
//				}
//				else
//				{
//					IJ.error("Image Type Error");
//					System.exit(-1);
//				}
//				
//				
//				
//				if (dg.processROI)
//				{
//					ImageProcessor ip3 = ip.resize(width, height);
//					for (int i = 0; i < width; i++)
//					{
//						for (int j = 0; j < height; j++)
//						{
//							ip3.set(i, j, ip.get(i + dg.roixs, j + dg.roiys));
//						}
//					}
//					ip = ip3;
//				}
//
//				ImageProcessor ip2 = ip.duplicate();
//				
//				ImagePlus i,mp = new ImagePlus("" + index, ip2);
//					
//				FileSaver fs = new FileSaver(imp);
//				fs.saveAsTiff(dg.STORMPath + index + note + ".tif");
//				
//
//
//
//				if (ok)
//				{
//					if (s<threads.length)
//						freeThread=s;
//					else
//					{
//						freeThread=-1;
//						while (freeThread==-1)
//						{
//							for (int t=0;t<threads.length;t++)
//							{
//								if (!threads[t].isAlive())
//								{
//									freeThread=t;
//									break;
//								}
//							}
//							if (freeThread==-1)
//							{
//								try
//								{
//									Thread.currentThread().sleep(1);
//								}
//								catch(Exception e)
//								{
//									IJ.error(""+e);
//								}
//							}
//						}
//					}
//
//					threads[freeThread] = new ProcessFrameSim();
//					threads[freeThread].mysetup(ip, f, dg, s);
//					threads[freeThread].start();
//
//					time_now = java.lang.System.currentTimeMillis();
//					time_took += time_now-time_start;
//					time_start = time_now;
//					if ((s>0) && (s%dg.viewer_update==0))
//					{
//						ij.IJ.showStatus("Processing at "+time_took/dg.viewer_update+" ms/frame "+(f.ptable.getCounter()-nparticles)/dg.viewer_update+" part/frame, detected "+nparticles+" particles");
//						nparticles=f.ptable.getCounter();
//						time_took=0;
//						if (dg.viewer_accumulate==0)
//						{
//							vUpdate = new ViewerUpdateSim();
//							vUpdate.mysetup(viewer);
//							vUpdate.start();
//						}
//						else
//						{
//							vUpdateShort = new ViewerUpdateShortSim();
//							vUpdateShort.mysetup(viewer, Math.round(s+1-dg.viewer_accumulate/2), Math.round(s+1+dg.viewer_accumulate/2));
//							vUpdateShort.start();
//						}
//					}
//				}
//				s++;
//				index++;
//				
//				long durBalance_end = GregorianCalendar.getInstance().getTimeInMillis();
//				
//				if ((durBalance_end-durBalance_start)<dg.pulse_separation)//Makeup for pulse_duration
//				{
//				
//				Thread.sleep(dg.pulse_separation-(durBalance_end-durBalance_start));
//					
//				}
//			}
//		
//			// core.unloadDevice("CCD");
//
//			aotf.Write("dau dis\r");
//			// End of the while loop
//
//			for (int t=0; t<threads.length;t++)
//			{
//				if(threads[t] != null)
//				{
//					try
//					{
//						threads[t].join();
//					}
//					catch(Exception e)
//					{
//						IJ.error(""+e);
//					}
//				}
//			}
//			if (f.psave!=null) f.psave.close();
//
//			if (dg.viewer_accumulate==0)
//				viewer.update();
//			else
//				viewer.updateShort(Math.round(s-dg.viewer_accumulate/2), s);
//			if (f.ptable.getCounter() < 5000000)
//			{
//				IJ.showStatus("Creating particle table, this should take a few seconds...");
//				f.ptable.show("Results");
//			}
//			else
//				IJ.showMessage("Warning", "Results table has too many particles, they will not be shown but the data still exists within it\nyou can still use all the plugin functionality or save table changes though the 'Save Particle Table' command.");
//		
//		}
//		catch (Exception e)
//		{
//			IJ.error(e.getMessage());
//			System.exit(-1);
//		}
//		
//	}
//	
//}